/*
 *
 * *******************************************************************
 *   @项目名称: BHex Android
 *   @文件名称: InterceptorWrapper.java
 *   @Date: 11/29/18 3:21 PM
 *   @Author: chenjun
 *   @Copyright（C）: 2018 BlueHelix Inc.   All rights reserved.
 *   注意：本内容仅限于内部传阅，禁止外泄以及用于其他的商业目的.
 *  *******************************************************************
 *
 */

package io.bhex.baselib.network.interceptor;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import okhttp3.Request;
import okhttp3.Response;

/**
 * ================================================
 * Application拦截器特点：
 * 不需要担心中间过程的响应,如重定向和重试.
 * 总是只调用一次,即使HTTP响应是从缓存中获取.
 * 观察应用程序的初衷. 不关心OkHttp注入的头信息如: If-None-Match.
 * 允许短路而不调用 Chain.proceed(),即中止调用.
 * 允许重试,使 Chain.proceed()调用多次.
 * <p>
 * {@link okhttp3.Interceptor} 的使用方式，限制了我们不能使用装饰者来实现我们任意动态添加拦截器的想法，
 * 只能是我们自己再实现一个接口，来模拟, 从而损失了随时终止链式调用的特性
 * <p>
 * ================================================
 */

public class InterceptorWrapper implements okhttp3.Interceptor {
    private List<Interceptor> list = new ArrayList<>();

    @Override
    public Response intercept(Chain chain) throws IOException {

        //交给子Interceptor
        Request request = chain.request();

        for (Interceptor interceptor : list) {
            request = interceptor.intercept(request, chain);
        }

        //执行子Interceptor处理过的
        Response response = chain.proceed(request);

        //交给子Interceptor
        for (int i = list.size() - 1; i >= 0; i--) {
            response = list.get(i).intercept(response, chain);
        }

        return response;
    }

    public boolean addInterceptor(Interceptor interceptor) {
        return list.add(interceptor);
    }

    public boolean removeInterceptor(Interceptor interceptor) {
        return list.remove(interceptor);
    }

}
